package cn.iocoder.yudao.framework.swagger.config;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * Swagger2 自动配置类
 *
 * @author 芋道源码
 */
@Configuration
@EnableSwagger2
//@EnableKnife4j
@ConditionalOnClass({Docket.class, ApiInfoBuilder.class})
// 允许使用 swagger.enable=false 禁用 Swagger
@ConditionalOnProperty(prefix = "yudao.swagger", value = "enable", matchIfMissing = true)
@EnableConfigurationProperties(SwaggerProperties.class)
public class YudaoSwaggerAutoConfiguration {

//    @Bean
//    @ConditionalOnMissingBean
//    public SwaggerProperties swaggerProperties() {
//        return new SwaggerProperties();
//    }
//
//    @Bean
//    public Docket createRestApi() {
//        SwaggerProperties properties = swaggerProperties();
//        // 创建 Docket 对象
//        return new Docket(DocumentationType.SWAGGER_2)
//                // 用来创建该 API 的基本信息，展示在文档的页面中（自定义展示的信息）
//                .apiInfo(apiInfo(properties))
//                // 设置扫描指定 package 包下的
//                .select()
//                .apis(basePackage(properties.getBasePackage()))
////                .apis(basePackage("cn.iocoder.yudao.module.infra")) // 可用于 swagger 无法展示时使用
//                .paths(PathSelectors.any())
//                .build()
//                .securitySchemes(securitySchemes())
//                .globalRequestParameters(globalRequestParameters())
//                .securityContexts(securityContexts());
//    }
//
//    // ========== apiInfo ==========
//
//    /**
//     * API 摘要信息
//     */
//    private static ApiInfo apiInfo(SwaggerProperties properties) {
//        return new ApiInfoBuilder()
//                .title(properties.getTitle())
//                .description(properties.getDescription())
//                .contact(new Contact(properties.getAuthor(), null, null))
//                .version(properties.getVersion())
//                .build();
//    }
//
//    // ========== securitySchemes ==========
//
//    /**
//     * 安全模式，这里配置通过请求头 Authorization 传递 token 参数
//     */
//    private static List<SecurityScheme> securitySchemes() {
//        return Collections.singletonList(new ApiKey(HttpHeaders.AUTHORIZATION, "Authorization", "header"));
//    }
//
//    /**
//     * 安全上下文
//     *
//     * @see #securitySchemes()
//     * @see #authorizationScopes()
//     */
//    private static List<SecurityContext> securityContexts() {
//        return Collections.singletonList(SecurityContext.builder()
//                .securityReferences(securityReferences())
//                .forPaths(PathSelectors.regex("^(?!auth).*$"))
//                .build());
//    }
//
//    private static List<SecurityReference> securityReferences() {
//        return Collections.singletonList(new SecurityReference(HttpHeaders.AUTHORIZATION, authorizationScopes()));
//    }
//
//    private static AuthorizationScope[] authorizationScopes() {
//        return new AuthorizationScope[]{new AuthorizationScope("global", "accessEverything")};
//    }
//
//    // ========== globalRequestParameters ==========
//
//    private static List<RequestParameter> globalRequestParameters() {
//        RequestParameterBuilder tenantParameter = new RequestParameterBuilder().name("tenant-id").description("租户编号")
//                .in(ParameterType.HEADER).example(new ExampleBuilder().value(1L).build());
//        return Collections.singletonList(tenantParameter.build());
//    }

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.OAS_30).pathMapping("/")

                // 定义是否开启swagger，false为关闭，可以通过变量控制
                .enable(true)

                // 将api的元信息设置为包含在json ResourceListing响应中。
                .apiInfo(apiInfo())

                // 接口调试地址
                .host("http://wwww.123.com")

                // 选择哪些接口作为swagger的doc发布
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build()

                // 支持的通讯协议集合
//                .protocols(new HashSet("https", "http"))

                //                // 授权信息设置，必要的header token等认证信息
                //                .securitySchemes(securitySchemes())
                //
                //                // 授权信息全局应用
                //                .securityContexts(securityContexts())
                ;
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                // 文档标题
                .title("系统API服务")
                // 文档描述
                .description("系统API接口文档")
                // .termsOfServiceUrl("https://github.com/yidao620c")
                .version("v1")
                // .license("MIT 协议")
                // .licenseUrl("http://www.opensource.org/licenses/MIT")
                // .contact(new Contact("熊能","https://github.com/yidao620c","yidao620@gmail.com"))
                .build();
    }

}
